﻿using System;
using System.Collections.Generic;
using System.Linq;
using COMMON;
using VO;
using BLL;
using System.Web.UI.WebControls;

namespace PopPromotoraCallCenter
{
    public partial class AtendimentoCallCenter : System.Web.UI.Page
    {

        #region Propriedades
        private const int statusAgendamento = 5;
        private const int statusSucesso = 3;

        private int IdAtendente
        {
            get
            {

                //if (Request.QueryString["idUsuario"] != null)
                //{
                //    int.TryParse(Funcao.Decrypt(Request.QueryString["idUsuario"], Configuracao.CRYPTOKEY()), out id);
                //}
                var id = 0;
                if (Session["nIdUsuario"] != null)
                    id = Convert.ToInt16(Session["nIdUsuario"]);
                return id;
            }
        }

        private int IdCliente
        {
            get
            {
                if (Funcao.IsNumeric(hfIdCliente.Value))
                {
                    return int.Parse(hfIdCliente.Value);
                }
                return 0;
            }
        }

        private int IdClienteConsulta
        {
            get
            {
                var id = 0;
                if (Request.QueryString["idCliente"] != null)
                {
                    int.TryParse(Funcao.Decrypt(Request.QueryString["idCliente"], Configuracao.CRYPTOKEY()), out id);
                }
                return id;
            }
        }

        private int IdFila
        {
            get
            {
                if (Funcao.IsNumeric(hfIdFila.Value))
                {
                    return int.Parse(hfIdFila.Value);
                }
                return 0;
            }
        }

        private int IdCampanha
        {
            get
            {
                if (Funcao.IsNumeric(hfIdCampanha.Value))
                {
                    return int.Parse(hfIdCampanha.Value);
                }
                return 0;
            }
        }

        private int IdCampanhaConsulta
        {
            get
            {
                if (Request.QueryString["idCampanha"] != null)
                {
                    return int.Parse(Funcao.Decrypt(Request.QueryString["idCampanha"], Configuracao.CRYPTOKEY()));
                }
                return 0;
            }
        }
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;
            if (Session["nIdUsuario"] == null) return;
            ConfiguraTimer();
            ConfigurarControleTela();
            CarregarComboCampanha();
            ValidarConsultaAtendimento();
            CarregarComboDia();
            CarregarComboHora();
            CarregarContatoCliente(int.Parse(hfIdCliente.Value));
        }

        #region Metodos

        #region LimparCampos
        protected void LimparCampos()
        {
            hfIdCampanha.Value = "0";
            hfIdFila.Value = "0";
            hfIdCliente.Value = "0";
            lblNomeCampanha.Text = string.Empty;
            lblNomeCliente.Text = string.Empty;
            lblCPF.Text = string.Empty;
            lblIdade.Text = string.Empty;
            lblUF.Text = string.Empty;
            lblCidade.Text = string.Empty;
            lblBairro.Text = string.Empty;
            lblCEP.Text = string.Empty;
            lblPMT.Text = string.Empty;
            lblScore.Text = string.Empty;
            lblDescricao.Text = string.Empty;
            lblConvenio.Text = string.Empty;
            lblMargem.Text = string.Empty;
            //lblPrazo.Text = string.Empty;
            dlContato.DataBind();
            dlContatoService.DataBind();
            txtComentario.Text = string.Empty;
            ddlSituacao.SelectedIndex = 0;
            txtIdProposta.Text = string.Empty;
            ddlHora.SelectedIndex = 0;
            ddlDia.SelectedIndex = 0;
        }
        #endregion

        #region CarregarComboHora
        protected void CarregarComboHora()
        {
            ddlHora.Items.Clear();
            for (int a = 1; a < 24; a++)
            {
                ddlHora.Items.Add(a.ToString());
            }
            ddlHora.Items.Insert(0, new ListItem("Hora(s)", "0"));
        }
        #endregion

        #region CarregarComboDia
        protected void CarregarComboDia()
        {
            ddlDia.Items.Clear();
            for (int a = 1; a < 4; a++)
            {
                ddlDia.Items.Add(a.ToString());
            }
            ddlDia.Items.Insert(0, new ListItem("Dia(s)", "0"));
        }
        #endregion

        #region ValidarConsultaAtendimento
        protected void ValidarConsultaAtendimento()
        {
            var retorno = SorteioBLL.ValidaVinculadoAgendado(0, IdAtendente);
            if (retorno.Error == Enumerator.Error.NoRegistry)
            {
                if (IdClienteConsulta > 0 || IdCampanhaConsulta > 0)
                {
                    //Atendente não tem ninguém preso na fila, portanto, pode atender o cliente consultado
                    AtendeClienteConsultado();
                }
                else
                    pnlSorteio.Visible = true;
            }
            else if (retorno.Error == Enumerator.Error.Success)
            {
                //Atendente tem cliente vinculado ou agendado, portanto, deve finalizar este atendimento
                Funcao.Alert(ClientScript,
                             retorno.List[0].TipoSorteio == Enumerator.TipoSorteio.Agendado
                                 ? "Você tem um cliente agendado"
                                 : "Você tem cliente preso na fila, é necessário fechar este atendimento");

                //Chama método Sorteio
                SortearCliente();
            }
            else
                Funcao.Alert(ClientScript, retorno.Message);
        }
        #endregion

        #region AtendeClienteConsultado
        protected void AtendeClienteConsultado()
        {
            if (IdAtendente > 0 && IdClienteConsulta > 0 && IdCampanhaConsulta > 0)
            {
                var retorno = SorteioBLL.AtendeClienteConsulta(IdAtendente, IdCampanhaConsulta, IdClienteConsulta);
                if (retorno.Error == Enumerator.Error.Success)
                {
                    hfIdCampanha.Value = IdCampanhaConsulta.ToString();
                    hfIdCliente.Value = IdClienteConsulta.ToString();
                    hfIdFila.Value = retorno.List[0].idFila.ToString();
                    //Carrega dados do cliente
                    if (CarregarDadosCliente(IdClienteConsulta) == Enumerator.Error.Success)
                    {
                        //Carregar combo situação
                        CarregarComboSituacao();

                        //Iniciar tempo de atendimento
                        IniciaTimer();

                        pnlSorteio.Visible = false;
                    }
                }
                else
                    Funcao.Alert(ClientScript, retorno.Message);
            }
            else
            {
                Funcao.Alert(ClientScript, "Parâmetros incorretos");
            }
        }
        #endregion

        #region ConfigurarControleTela
        protected void ConfigurarControleTela()
        {
            pnlSorteio.Visible = false;
            pnlDadosCliente.Visible = false;
            pnlAtendimento.Visible = false;
            btnFinalizar.Visible = false;
            trProposta.Visible = false;
            trAgendamento.Visible = false;
            dvAcoes.Visible = false;
            lblAcao.Visible = false;
        }
        #endregion

        #region CarregarComboCampanha
        protected void CarregarComboCampanha()
        {
            var retorno = CampanhaAtendenteBLL.Select(IdAtendente);
            if (retorno.Error == Enumerator.Error.Success)
            {
                ddlCampanha.DataValueField = "idCampanha";
                ddlCampanha.DataTextField = "nomeCampanha";
                ddlCampanha.DataSource = retorno.List;
                ddlCampanha.DataBind();
                ddlCampanha.Items.Insert(0, new ListItem("TODAS", "0"));
            }
            else if (retorno.Error == Enumerator.Error.Failed)
                Funcao.Alert(ClientScript, retorno.Message);
        }
        #endregion

        #region CarregarComboSituacao
        protected void CarregarComboSituacao()
        {
            var retorno = CampanhaStatusBLL.Select(IdCampanha);
            if (retorno.Error == Enumerator.Error.Success)
            {

                var resultado = from l in retorno.List
                                group l by new { l.nomeStatus, l.idStatus } into g
                                select new { g.Key.nomeStatus, g.Key.idStatus };



                ddlSituacao.DataTextField = "nomeStatus";
                ddlSituacao.DataValueField = "idStatus";
                ddlSituacao.DataSource = resultado;
                ddlSituacao.DataBind();
                ddlSituacao.Items.Insert(0, new ListItem("selecione", "0"));
            }
            else
                Funcao.Alert(ClientScript, retorno.Message);
        }
        #endregion

        #region SortearCliente
        protected void SortearCliente()
        {
            int idCampanha;
            if (int.TryParse(ddlCampanha.SelectedValue, out idCampanha))
            {
                //Retorna ID do cliente sorteado
                var retorno = SorteioBLL.Sorteio(IdAtendente, idCampanha);
                switch (retorno.Error)
                {
                    case Enumerator.Error.Success:
                        {
                            var idCliente = retorno.ID;
                            hfIdCampanha.Value = retorno.List[0].idCampanha.ToString();
                            hfIdCliente.Value = retorno.List[0].idCliente.ToString();
                            hfIdFila.Value = retorno.List[0].idFila.ToString();
                            //Carrega dados do cliente
                            if (CarregarDadosCliente(idCliente) == Enumerator.Error.Success)
                            {
                                switch (retorno.List[0].TipoSorteio)
                                {
                                    case Enumerator.TipoSorteio.Sorteado:
                                        {
                                            DateTime data = DateTime.Now;
                                            //Registra data e hora de início do atendimento
                                            hfTempoInicial.Value = data.ToShortDateString() + " " + data.ToLongTimeString();
                                        }
                                        break;
                                    case Enumerator.TipoSorteio.Agendado:
                                        {
                                            var retornoF = FilaBLL.VinculaClienteAgendado(retorno.List[0].idFila);
                                            if (retornoF.Error == Enumerator.Error.Failed)
                                                Funcao.Alert(ClientScript, retornoF.Message);

                                            hfTempoInicial.Value = retornoF.List[0].dtInicioAtendimento.ToString();
                                        }
                                        break;
                                    case Enumerator.TipoSorteio.Vinculado:
                                        hfTempoInicial.Value = retorno.List[0].dtInicioAtendimento.ToString();
                                        break;
                                }


                                //Carregar combo situação
                                CarregarComboSituacao();

                                //Iniciar tempo de atendimento
                                IniciaTimer();
                            }
                        }
                        break;
                    case Enumerator.Error.Failed:
                        Funcao.Alert(ClientScript, retorno.Message);
                        break;
                    default:
                        Funcao.Alert(ClientScript, "Não há clientes para serem sorteados. Por favor, avise seu supervisor");
                        break;
                }
            }
            else
                Funcao.Alert(ClientScript, "Você não está participando de nenhuma campanha. Por favor, avise seu supervisor.");
        }
        #endregion

        #region CarregarDadosCliente
        protected Enumerator.Error CarregarDadosCliente(int idCliente)
        {
            var retornoCliente = ClienteBLL.Select(idCliente);
            if (retornoCliente.Error == Enumerator.Error.Success)
            {
                var list = retornoCliente.List;
                lblNomeCampanha.Text = list[0].NomeCampanha;
                lblNomeCliente.Text = list[0].nmCliente;
                lblCPF.Text = list[0].CPF;
                lblIdade.Text = list[0].idade.ToString();
                lblUF.Text = list[0].UF;
                lblCidade.Text = list[0].cidade;
                lblBairro.Text = list[0].bairro;
                lblCEP.Text = list[0].CEP;
                lblPMT.Text = list[0].PMT.ToString();
                lblScore.Text = list[0].score.ToString();
                lblDescricao.Text = list[0].descricao;
                lblConvenio.Text = list[0].convenio;
                lblMargem.Text = list[0].margem.ToString();
                //lblPrazo.Text = list[0].prazo.ToString();
                CarregarContatoCliente(idCliente);
            }
            else
                Funcao.Alert(ClientScript, retornoCliente.Message);

            return retornoCliente.Error;
        }
        #endregion

        #region CarregarContatoCliente
        protected void CarregarContatoCliente(int idCliente)
        {
            var retorno = ContatoClienteBLL.Select(idCliente, Enumerator.TipoContato.InteroEExterno);
            if (retorno.Error == Enumerator.Error.Success)
            {
                dlContato.DataSource = retorno.List;
                dlContato.DataBind();
            }
            else if (retorno.Error == Enumerator.Error.Failed)
                Funcao.Alert(ClientScript, retorno.Message);
        }
        #endregion

        #region IniciaTimer
        protected void IniciaTimer()
        {
            if (string.IsNullOrWhiteSpace(hfTempoInicial.Value))
            {
                DateTime data = DateTime.Now;
                //Registra data e hora de início do atendimento
                hfTempoInicial.Value = data.ToShortDateString() + " " + data.ToLongTimeString();
            }
            lblInicioAtendimento.Text = hfTempoInicial.Value;
            //Zera data e hora final do atendimento
            hfTempoFinal.Value = string.Empty;
            //Habilita timer
            Timer1.Enabled = true;
            //Configura botões
            pnlDadosCliente.Visible = true;
            lblAcao.Visible = true;
            dvAcoes.Visible = true;
            pnlAtendimento.Visible = true;
            btnFinalizar.Visible = true;
            //Zera label resultado
            lblResultado.Text = string.Empty;
            //Esconde panel sorteio
            pnlSorteio.Visible = false;
        }
        #endregion

        #region ConfiguraTimer
        protected void ConfiguraTimer()
        {
            //Intervalo do timer para 1 segundo
            Timer1.Interval = 821;
            Timer1.Enabled = false;
        }
        #endregion

        #region FinalizarAtendimento
        protected void FinalizarAtendimento()
        {
            if (!ValidarAtendimento()) return;
            Timer1.Enabled = false;
            //Calcula tempo de atendimento
            CalculaTempo();
            //Grava comentário e situação
            GravarSituacao();
        }
        #endregion

        #region CalculaTempo
        protected void CalculaTempo()
        {
            var data = DateTime.Now;
            //Registra data e hora final do atendimento
            hfTempoFinal.Value = data.ToShortDateString() + " " + data.ToLongTimeString();

            //Recupera data inicial e final do atendimento
            DateTime dataInicial;
            DateTime dataFinal;
            var validaDataInicial = DateTime.TryParse(hfTempoInicial.Value, out dataInicial);
            var validaDataFinal = DateTime.TryParse(hfTempoFinal.Value, out dataFinal);

            if (validaDataInicial && validaDataFinal)
            {
                //Calcula tempo de atendimento
                string tempo = dataFinal.Subtract(dataInicial).ToString();
                string resultado = "O tempo de atendimento foi: " + tempo;
                lblResultado.Text = resultado;
                lblContador.Text = string.Empty;
            }
            //Configura botões
            ConfigurarControleTela();
        }
        #endregion

        #region HabilitaCamposSituacao
        protected void HabilitaCamposSituacao()
        {
            int status = int.Parse(ddlSituacao.SelectedValue);
            trProposta.Visible = status.Equals(statusSucesso);
            trAgendamento.Visible = status.Equals(statusAgendamento);
        }
        #endregion

        #region ValidarAtendimento
        protected bool ValidarAtendimento()
        {
            string msg = string.Empty;
            if (string.IsNullOrWhiteSpace(txtComentario.Text))
                msg = "Preencha o campo Comentário";
            else if (ddlSituacao.SelectedValue.Equals("0"))
                msg = "Selecione a situação";
            else if (ddlSituacao.SelectedValue.Equals(statusSucesso.ToString()) && !Funcao.IsNumeric(txtIdProposta.Text.Trim()))
                msg = "O ID da proposta é obrigatório. Campo numérico";
            else if (ddlSituacao.SelectedValue.Equals(statusAgendamento.ToString()) && (ddlHora.SelectedIndex == 0 && ddlDia.SelectedIndex == 0))
                msg = "Selecione o período de agendamento";
            var retorno = string.IsNullOrWhiteSpace(msg);
            if (!retorno)
                Funcao.Alert(ClientScript, msg);
            //lblMsg.Text = msg;
            return retorno;
        }
        #endregion

        #region GravarSituacao
        protected void GravarSituacao()
        {
            if (GravarHistorico() == Enumerator.Error.Success)
            {
                ProcessarRegras();
            }
        }
        #endregion

        #region GravarHistorico
        protected Enumerator.Error GravarHistorico()
        {
            var comentario = txtComentario.Text.Trim();
            var situacao = int.Parse(ddlSituacao.SelectedValue);
            var idProposta = string.IsNullOrWhiteSpace(txtIdProposta.Text) ? 0 : int.Parse(txtIdProposta.Text.Trim());
            var obj = new HistoricoAtendimento
                          {
                              idCampanha = IdCampanha,
                              idCliente = IdCliente,
                              idOperador = IdAtendente,
                              idProposta = idProposta,
                              idStatus = situacao,
                              dtHistorico = DateTime.Now,
                              dtInicioAtendimento = DateTime.Parse(lblInicioAtendimento.Text),
                              comentario = comentario
                          };
            var retorno = HistoricoAtendimentoBLL.Insert(obj);
            if (retorno.Error == Enumerator.Error.Failed)
                Funcao.Alert(ClientScript, retorno.Message);
            return retorno.Error;
        }
        #endregion

        #region ProcessarRegras
        protected void ProcessarRegras()
        {
            var obj = new RegraAtendimento
                          {
                              idCliente = IdCliente,
                              idCampanha = IdCampanha,
                              idOperador = IdAtendente,
                              idStatus = int.Parse(ddlSituacao.SelectedValue),
                              idFila = IdFila,
                              cpf = lblCPF.Text.Trim(),
                              dtReAgendamento = DateTime.Now
                          };
            if (ddlSituacao.SelectedValue.Equals(statusAgendamento.ToString()))
            {
                var dtAgendamento =
                    obj.dtReAgendamento.AddHours(int.Parse(ddlHora.SelectedValue)).AddHours(
                        int.Parse(ddlDia.SelectedValue)*24);
                
                while (!ValidaDiaUtil(dtAgendamento))
                {
                    dtAgendamento = dtAgendamento.AddDays(1);
                }
                obj.dtReAgendamento = dtAgendamento;

                obj.blnAgendamento = true;

            }
            else
            {
                obj.blnAgendamento = false;
            }
            var retorno = RegraAtendimentoBLL.FinalizaAtendimento(obj);
            if (retorno.Error == Enumerator.Error.Success)
            {
                Funcao.Alert(ClientScript, "Atendimento finalizado com sucesso");
                LimparCampos();
                pnlSorteio.Visible = true;
                //ValidarConsultaAtendimento();
            }
            else
                Funcao.Alert(ClientScript, retorno.Message);
        }
        #endregion

        #region ConsultaZipCode
        protected void ConsultaZipCode()
        {
            var retorno = ContatoServicoBLL.ConsultaContatoZipCode(lblCPF.Text, IdCliente, IdAtendente);
            if (retorno.Error == Enumerator.Error.Success)
            {
                dlContatoService.DataSource = retorno.List;
                dlContatoService.DataBind();
                dlContatoService.Visible = true;
                dlContato.Visible = false;
                GravarContatoCliente(retorno.List);
                CarregarContatoCliente(int.Parse(hfIdCliente.Value));
                
            }
            else
                Funcao.Alert(ClientScript, retorno.Message);
        }
        #endregion


        #region ConsultaConfirme
        protected void ConsultaConfirme()
        {
            var retorno = ContatoServicoBLL.ConsultaContatoConfirme(lblCPF.Text, IdCliente, IdAtendente);
            if (retorno.Error == Enumerator.Error.Success)
            {
                dlContatoService.DataSource = retorno.List;
                dlContatoService.DataBind();
                dlContatoService.Visible = true;
                dlContatoService.Visible = false;
                GravarContatoCliente(retorno.List);
                CarregarContatoCliente(int.Parse(hfIdCliente.Value));
               
            }
            else
                Funcao.Alert(ClientScript, retorno.Message);
        }
        #endregion
        

        #region GravarContatoCliente
        protected void GravarContatoCliente(IList<ContatoCliente> list)
        {
            var retorno = ContatoClienteBLL.Insert(list);
            if (retorno.Error == Enumerator.Error.Failed)
                Funcao.Alert(ClientScript, retorno.Message);
        }
        #endregion

        #endregion

        #region Eventos

        #region Timer1_Tick
        protected void Timer1_Tick(object sender, EventArgs e)
        {
            //Recupera data inicial e final do atendimento
            DateTime dataInicial;
            DateTime dataFinal = DateTime.Now;
            DateTime.TryParse(hfTempoInicial.Value, out dataInicial);

            var tempo = dataFinal.Subtract(dataInicial);
            var segundo = tempo.Seconds;
            var minuto = tempo.Minutes;
            var hora = tempo.Hours;
            var dia = tempo.Days;

            lblContador.Text = (dia > 0 ? dia + " dia(s) " : string.Empty) + Funcao.RetornaStringMinima(hora.ToString(), 2) + ":" + Funcao.RetornaStringMinima(minuto.ToString(), 2) + ":" + Funcao.RetornaStringMinima(segundo.ToString(), 2);
        }
        #endregion

        #region btnIniciar_Click
        protected void btnIniciar_Click(object sender, EventArgs e)
        {
            IniciaTimer();
        }
        #endregion

        #region btnFinalizar_Click
        protected void btnFinalizar_Click(object sender, EventArgs e)
        {
            FinalizarAtendimento();
        }
        #endregion

        #region btnSortear_Click
        protected void btnSortear_Click(object sender, EventArgs e)
        {
            SortearCliente();
        }
        #endregion

        #region ddlSituacao_SelectedIndexChanged
        protected void ddlSituacao_SelectedIndexChanged(object sender, EventArgs e)
        {
            HabilitaCamposSituacao();
        }
        #endregion

        #region btnConsultaZipCode_Click
        protected void btnConsultaZipCode_Click(object sender, EventArgs e)
        {
            ConsultaZipCode();
        }
        #endregion

        #region btnConsultaConfirme_Click
        protected void btnConsultaConfirme_Click(object sender, EventArgs e)
        {
            ConsultaConfirme();
        }
        #endregion

        #region btnConsultaPop_Click
        protected void btnConsultaPop_Click(object sender, EventArgs e)
        {
            CarregarContatoCliente(int.Parse(hfIdCliente.Value));
            dlContato.Visible = true;
            dlContatoService.Visible = false;
        }
        #endregion
        #region TestaDiaUtil
        protected  Boolean ValidaDiaUtil(DateTime dtAgendamento)
        {
            var blnReturn = true;
            var retorno = RegraAtendimentoBLL.SelectFeriaddo(dtAgendamento.Day.ToString(),
                                                             dtAgendamento.Month.ToString());
            if (retorno.List.Count > 0)
                blnReturn = false;
            else if (dtAgendamento.DayOfWeek == DayOfWeek.Sunday)
                blnReturn = false;
            return blnReturn;
        }


        #endregion

        #endregion

    }
}